/*
 * Merge.h
 *
 *  Created on: Oct 8, 2012
 *      Author: romina
 */

#ifndef MERGE_H_
#define MERGE_H_

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <sstream>
#include <exception>
#include "../Comunes/Constantes.h"
#include "../Comunes/Archivos/ArchivosManager.h"
#include "../Comunes/Palabra.h"
#include "../Comunes/Archivos/Directorio.h"
#include "../Comunes/Entidades/RecordTermino.h"
#include "Buffer.h"
#include "Particion.h"


using namespace std;
using namespace archivos;
using namespace palabra;

namespace ordenamiento{

class NoSeEncontraronParticionesException: public exception{
  virtual const char* what() const throw()
  {
    return "No se cargaron las particiones, primero debe realizar el ordenamiento externo.";
  }
};

class Merge {
	Buffer* bufferFusion;
	Particion * particiones;
	QBuffer * qbuffers;
	ArchivoDeTexto * file_log;
	int cant_part;
	string path_fusiones;
	string path_particiones;
	string path_archivo_ordenado;
	void cerrar_particiones();
	//almacena las particiones que fueron
	//creadas en la fase de ordenamiento
	int cargar_particiones(int num, string ruta);
	//carga el vector de buffers para las particiones
	void cargar_buffers();
	//carga el buffer con el indice imposible
	void llenar_buffer_con_imposibles(int pos_buffer);
	//carga un buffer con la particion
	void llenar_buffer_con_particion(int id_part);
	//verifica si en todos los buffers solo contienen el registro imposible
	bool fin_de_archivos();
	//calcula cuantos registros quedan pendientes
	int pendientes_fusion();
	//realiza el merge recorriendo los buffers
	void merge_intermedio(ArchivoBinario * fusion);
	//pasa los registros del buffer de fusion a un archivo de fusion
	void transferir_buffer_de_fusion(ArchivoBinario * fusion, bool is_last);
public:
	Merge(string dir_fusiones, string dir_particiones, int cant_part);
	//primero hace el merge de las particiones y luego las etapas sucesivas
	void merge();
	string get_path_archivo_ordenado();
	virtual ~Merge();
};

}/* namespace ordenamiento */
#endif /* MERGE_H_ */
